package socket;
import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
/*
聊天室客户端
 */
public class Client {
    /*
    java.net,Socket "套接字“
    该类封装了TCP协议的通讯细节，使用它可以与服务器建立连接
    并基于两条流（输入与输出）的读写完成与对方的交互
    我们可以将Socket比喻为“电话”
     */
    private Socket socket;
    /*
    windows
    win+r:输入cmd回车
    在命令行输入ipcomfid/all查看自己的ip地址

    mac
    五个手指头在触摸板上向中间抓，找到“终端”这个软件并打开
    在中端程序中输入ipconfig查看自己的ip地址

     */
    public Client(){
        try {
            /*
            实例化Socket时就是与远端计算及建立连接的过程
            这里需要传入两个参数：
            1.服务器ip地址，用于找到网络上对方的计算机
            2.服务端口用于找到服务器端计算机上的服务器端应用程序
             */
            System.out.println("正在连接服务端...");
            socket=new Socket("192.168.0.178",8088);
            System.out.println("与服务端建立连接!");
        }catch (IOException e){
            e.printStackTrace();
        }
    }
    public void start(){
        try {
            /*
            Socket提供的重要方法：
            OutputSteam getOutputStream()
            该方法返回的字节输出流写出的字节会发送给远端计算机
             */
            OutputStream out=socket.getOutputStream();
            OutputStreamWriter osw=new OutputStreamWriter(out,StandardCharsets.UTF_8);
            BufferedWriter bw=new BufferedWriter(osw);
            PrintWriter pw=new PrintWriter(bw,true);
            pw.println("你好服务端！");
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            try {
                /*
                Socket的close方法会将通过它获取的流关闭，并且会向远端计算机发送TCP断开连接的挥手动作
                 */
                socket.close();
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        Client client=new Client();
        client.start();
    }
}
